Buka kekuatan praproses Scikit-learn dengan alur transformasi data. Pelajari cara membangun alur kerja machine learning yang kuat dan efisien untuk performa model optimal.
Praproses Scikit-learn: Menguasai Alur Transformasi Data untuk Machine Learning
Dalam dunia machine learning, kualitas data Anda secara langsung memengaruhi performa model Anda. Data mentah sering kali mengandung inkonsistensi, nilai yang hilang, dan skala yang bervariasi, sehingga tidak cocok untuk penggunaan langsung. Scikit-learn, sebuah pustaka Python yang kuat, menyediakan serangkaian teknik praproses yang komprehensif untuk mengubah data Anda menjadi format yang sesuai untuk algoritma machine learning. Artikel ini membahas dunia praproses Scikit-learn, dengan fokus pada pembuatan dan pemanfaatan alur transformasi data untuk merampingkan alur kerja machine learning Anda.
Mengapa Praproses Data Sangat Penting
Praproses data adalah proses membersihkan, mengubah, dan mengatur data mentah agar lebih sesuai untuk model machine learning. Ini adalah langkah penting karena algoritma machine learning sensitif terhadap skala dan distribusi fitur input. Tanpa praproses yang tepat, model dapat berkinerja buruk, menyebabkan prediksi yang tidak akurat dan hasil yang tidak dapat diandalkan. Berikut adalah beberapa alasan utama mengapa praproses data sangat penting:
- Peningkatan Performa Model: Data yang telah diproses memungkinkan model untuk belajar lebih efektif dan mencapai akurasi yang lebih tinggi.
- Menangani Nilai yang Hilang: Teknik imputasi mengisi titik data yang hilang, mencegah algoritma mogok atau menghasilkan hasil yang bias.
- Menyeragamkan Skala Fitur: Metode penskalaan memastikan bahwa semua fitur berkontribusi secara setara pada model, mencegah fitur dengan nilai yang lebih besar mendominasi proses pembelajaran.
- Mengodekan Variabel Kategorikal: Teknik pengodean mengubah data kategorikal menjadi representasi numerik yang dapat dipahami oleh algoritma machine learning.
- Mengurangi Noise dan Outlier: Praproses dapat membantu mengurangi dampak outlier dan data noisy, yang mengarah pada model yang lebih kuat.
Pengantar Alur Scikit-learn
Alur Scikit-learn menyediakan cara untuk merantai beberapa langkah transformasi data menjadi satu objek yang dapat digunakan kembali. Ini menyederhanakan kode Anda, meningkatkan keterbacaan, dan mencegah kebocoran data selama evaluasi model. Alur pada dasarnya adalah urutan transformasi data yang diikuti oleh estimator akhir (misalnya, classifier atau regressor). Berikut adalah mengapa alur sangat bermanfaat:
- Organisasi Kode: Alur merangkum seluruh alur kerja praproses data dan pemodelan menjadi satu unit, membuat kode Anda lebih terorganisir dan lebih mudah dipelihara.
- Pencegahan Kebocoran Data: Alur memastikan bahwa transformasi data diterapkan secara konsisten pada data pelatihan dan pengujian, mencegah kebocoran data, yang dapat menyebabkan overfitting dan generalisasi yang buruk.
- Penyederhanaan Evaluasi Model: Alur memudahkan untuk mengevaluasi performa model Anda menggunakan teknik seperti validasi silang, karena seluruh alur kerja praproses dan pemodelan diterapkan secara konsisten ke setiap lipatan.
- Penyederhanaan Penerapan: Alur dapat dengan mudah diterapkan ke lingkungan produksi, memastikan bahwa data diproses sebelumnya dengan cara yang sama seperti saat pelatihan.
Teknik Praproses Data Umum di Scikit-learn
Scikit-learn menawarkan berbagai teknik praproses. Berikut adalah beberapa yang paling umum digunakan:
1. Penskalaan dan Normalisasi
Penskalaan dan normalisasi adalah teknik yang digunakan untuk mengubah fitur numerik ke rentang nilai yang serupa. Ini penting karena fitur dengan skala yang berbeda dapat memengaruhi proses pembelajaran secara tidak proporsional. Scikit-learn menyediakan beberapa metode penskalaan dan normalisasi:
- StandardScaler: Menstandardisasi fitur dengan menghapus mean dan penskalaan ke varians unit. Ini adalah teknik yang banyak digunakan yang mengasumsikan data mengikuti distribusi normal.
Rumus:
x_scaled = (x - mean) / standard_deviationContoh: Misalkan Anda memiliki harga rumah dalam USD dan luas persegi. Penskalaan fitur-fitur ini memastikan bahwa model tidak memberikan kepentingan yang tidak semestinya pada fitur dengan nilai yang lebih besar (misalnya, harga rumah).
- MinMaxScaler: Menskalakan fitur ke rentang tertentu, biasanya antara 0 dan 1. Ini berguna ketika Anda ingin mempertahankan distribusi asli data.
Rumus:
x_scaled = (x - min) / (max - min)Contoh: Pemrosesan gambar sering menggunakan MinMaxScaler untuk menormalkan nilai piksel ke rentang [0, 1].
- RobustScaler: Menskalakan fitur menggunakan statistik yang kuat terhadap outlier, seperti median dan rentang interkuartil (IQR). Ini adalah pilihan yang baik ketika data Anda mengandung outlier.
Rumus:
x_scaled = (x - median) / IQRContoh: Dalam dataset keuangan, di mana outlier umum (misalnya, fluktuasi pasar saham yang ekstrem), RobustScaler dapat memberikan hasil yang lebih stabil.
- Normalizer: Menormalkan sampel secara individual ke norma unit. Ini berguna ketika besaran vektor fitur lebih penting daripada nilai fitur individual.
Rumus (norma L2):
x_scaled = x / ||x||Contoh: Dalam pemrosesan teks, normalisasi vektor term frequency-inverse document frequency (TF-IDF) adalah praktik umum.
2. Mengodekan Variabel Kategorikal
Algoritma machine learning biasanya memerlukan input numerik, sehingga variabel kategorikal perlu diubah menjadi representasi numerik. Scikit-learn menawarkan beberapa teknik pengodean:
- OneHotEncoder: Membuat kolom biner untuk setiap kategori dalam fitur. Ini cocok untuk fitur kategorikal nominal (fitur tanpa urutan inheren).
Contoh: Mengodekan fitur "negara" dengan nilai seperti "USA," "Kanada," dan "UK" akan membuat tiga kolom baru: "country_USA," "country_Canada," dan "country_UK."
- OrdinalEncoder: Menetapkan nilai integer ke setiap kategori berdasarkan urutannya. Ini sesuai untuk fitur kategorikal ordinal (fitur dengan urutan yang bermakna).
Contoh: Mengodekan fitur "tingkat pendidikan" dengan nilai seperti "Sekolah Menengah Atas," "Sarjana," dan "Magister" akan menetapkan nilai integer seperti 0, 1, dan 2, masing-masing.
- LabelEncoder: Mengodekan label target dengan nilai antara 0 dan n_classes-1. Gunakan ini untuk mengodekan variabel target dalam masalah klasifikasi.
Contoh: Mengodekan label "spam" dan "bukan spam" sebagai 0 dan 1 masing-masing.
- TargetEncoder (memerlukan pustaka category_encoders): Mengodekan fitur kategorikal berdasarkan mean variabel target untuk setiap kategori. Dapat menyebabkan kebocoran target jika tidak digunakan dengan hati-hati dalam pengaturan validasi silang.
3. Menangani Nilai yang Hilang
Nilai yang hilang adalah masalah umum dalam dataset dunia nyata. Scikit-learn menyediakan teknik untuk mengimputasi (mengisi) nilai yang hilang:
- SimpleImputer: Mengimputasi nilai yang hilang menggunakan nilai konstan, mean, median, atau nilai fitur yang paling sering muncul.
- KNNImputer: Mengimputasi nilai yang hilang menggunakan algoritma k-nearest neighbors. Ini menemukan k sampel terdekat ke sampel dengan nilai yang hilang dan menggunakan nilai rata-rata dari tetangga tersebut untuk mengimputasi nilai yang hilang.
- IterativeImputer: Mengimputasi nilai yang hilang menggunakan pendekatan pemodelan iteratif. Setiap fitur dengan nilai yang hilang dimodelkan sebagai fungsi dari fitur lain, dan nilai yang hilang diprediksi secara iteratif.
4. Transformasi Fitur
Transformasi fitur melibatkan pembuatan fitur baru dari fitur yang ada. Ini dapat meningkatkan performa model dengan menangkap hubungan non-linear atau interaksi antar fitur. Beberapa teknik meliputi:
- PolynomialFeatures: Menghasilkan kombinasi polinomial dari fitur. Misalnya, jika Anda memiliki dua fitur x1 dan x2, PolynomialFeatures dapat membuat fitur baru seperti x1^2, x2^2, x1*x2.
- FunctionTransformer: Menerapkan fungsi kustom ke fitur. Ini memungkinkan Anda untuk melakukan transformasi arbitrer, seperti transformasi logaritma atau transformasi eksponensial.
- PowerTransformer: Menerapkan transformasi daya untuk membuat data lebih mirip Gaussian. Ini dapat berguna untuk algoritma yang mengasumsikan normalitas, seperti regresi linear. (Termasuk transformasi Box-Cox dan Yeo-Johnson)
Membangun Alur Transformasi Data dengan Scikit-learn
Sekarang, mari kita praktikkan teknik praproses ini dengan membangun alur transformasi data. Berikut adalah panduan langkah demi langkah:
1. Impor Pustaka yang Diperlukan
Mulailah dengan mengimpor pustaka yang diperlukan dari Scikit-learn:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder, SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import pandas as pd
2. Muat dan Siapkan Data Anda
Muat dataset Anda menggunakan pandas atau metode lain yang sesuai. Identifikasi fitur numerik dan kategorikal dalam dataset Anda. Misalnya:
data = {
'age': [25, 30, 35, 40, 45, None],
'country': ['USA', 'Canada', 'USA', 'UK', 'Canada', 'USA'],
'salary': [50000, 60000, 70000, 80000, 90000, 55000],
'purchased': [0, 1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)
3. Definisikan Langkah-Langkah Praproses
Buat instance transformer praproses yang ingin Anda gunakan. Misalnya, untuk menangani fitur numerik, Anda dapat menggunakan StandardScaler dan SimpleImputer. Untuk fitur kategorikal, Anda dapat menggunakan OneHotEncoder. Pertimbangkan untuk menyertakan strategi untuk menangani nilai yang hilang sebelum penskalaan atau pengodean.
numerical_features = ['age', 'salary']
categorical_features = ['country']
numerical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
4. Buat ColumnTransformer
Gunakan ColumnTransformer untuk menerapkan transformer yang berbeda ke kolom data Anda yang berbeda. Ini memungkinkan Anda untuk memproses fitur numerik dan kategorikal secara terpisah.
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_features),
('cat', categorical_transformer, categorical_features)
])
5. Bangun Alur
Buat objek Pipeline yang merantai langkah-langkah praproses dengan model machine learning. Ini memastikan bahwa data diproses sebelumnya secara konsisten sebelum dimasukkan ke model.
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', LogisticRegression())])
6. Latih dan Evaluasi Model
Bagi data Anda menjadi set pelatihan dan pengujian. Kemudian, latih alur pada data pelatihan dan evaluasi performanya pada data pengujian.
X = df.drop('purchased', axis=1)
y = df['purchased']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
pipeline.fit(X_train, y_train)
score = pipeline.score(X_test, y_test)
print(f'Model accuracy: {score}')
Contoh Kode Lengkap
Berikut adalah kode lengkap untuk membangun dan melatih alur transformasi data:
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder, SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# Sample Data
data = {
'age': [25, 30, 35, 40, 45, None],
'country': ['USA', 'Canada', 'USA', 'UK', 'Canada', 'USA'],
'salary': [50000, 60000, 70000, 80000, 90000, 55000],
'purchased': [0, 1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)
# Define features
numerical_features = ['age', 'salary']
categorical_features = ['country']
# Create transformers
numerical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# Create preprocessor
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_features),
('cat', categorical_transformer, categorical_features)
])
# Create pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', LogisticRegression())])
# Split data
X = df.drop('purchased', axis=1)
y = df['purchased']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train model
pipeline.fit(X_train, y_train)
# Evaluate model
score = pipeline.score(X_test, y_test)
print(f'Model accuracy: {score}')
Teknik Alur Tingkat Lanjut
Setelah Anda merasa nyaman dengan dasar-dasarnya, Anda dapat menjelajahi teknik alur yang lebih canggih:
1. Transformer Kustom
Anda dapat membuat transformer kustom Anda sendiri untuk melakukan transformasi data spesifik yang tidak tersedia di Scikit-learn. Untuk membuat transformer kustom, Anda perlu mewarisi dari kelas TransformerMixin dan BaseEstimator dan mengimplementasikan metode fit dan transform. Ini bisa berguna untuk rekayasa fitur atau transformasi khusus domain. Ingatlah untuk menyertakan docstring yang sesuai untuk keterbacaan.
2. Feature Union
FeatureUnion memungkinkan Anda menggabungkan output beberapa transformer menjadi satu vektor fitur. Ini bisa berguna ketika Anda ingin menerapkan transformasi yang berbeda ke fitur yang sama atau menggabungkan fitur yang telah diubah dengan cara yang berbeda. Kelas FeatureUnion digunakan untuk menggabungkan output beberapa transformer menjadi satu vektor fitur.
3. Grid Search dengan Alur
Anda dapat menggunakan GridSearchCV untuk mengoptimalkan hyperparameter alur Anda, termasuk hyperparameter langkah-langkah praproses. Ini memungkinkan Anda untuk secara otomatis menemukan kombinasi terbaik dari teknik praproses dan parameter model. Berhati-hatilah terhadap peningkatan biaya komputasi.
Praktik Terbaik untuk Alur Praproses Data
Berikut adalah beberapa praktik terbaik yang perlu diingat saat membangun alur praproses data:
- Pahami Data Anda: Sebelum menerapkan teknik praproses apa pun, luangkan waktu untuk memahami data Anda. Jelajahi distribusi fitur Anda, identifikasi nilai yang hilang, dan cari outlier.
- Dokumentasikan Alur Anda: Tambahkan komentar ke kode Anda untuk menjelaskan setiap langkah alur. Ini akan membuatnya lebih mudah untuk memahami dan memelihara kode Anda.
- Uji Alur Anda: Uji secara menyeluruh alur Anda untuk memastikan bahwa ia berfungsi dengan benar. Gunakan unit test untuk memverifikasi bahwa setiap langkah alur menghasilkan output yang diharapkan.
- Hindari Kebocoran Data: Berhati-hatilah untuk menghindari kebocoran data saat memproses data Anda. Pastikan bahwa Anda hanya menggunakan informasi dari data pelatihan untuk memproses data pelatihan. Gunakan alur untuk memastikan konsistensi antara data pelatihan dan pengujian.
- Pantau Performa: Pantau performa model Anda dari waktu ke waktu dan latih ulang seperlunya. Distribusi data dapat berubah dari waktu ke waktu, jadi penting untuk secara berkala mengevaluasi ulang alur Anda dan membuat penyesuaian seperlunya.
Contoh Dunia Nyata
Mari kita jelajahi beberapa contoh dunia nyata tentang bagaimana alur transformasi data dapat digunakan di berbagai industri:
- Keuangan: Dalam pemodelan risiko kredit, alur dapat digunakan untuk memproses data pelanggan, termasuk fitur numerik seperti pendapatan dan skor kredit, serta fitur kategorikal seperti status pekerjaan dan tujuan pinjaman. Nilai yang hilang dapat diimputasi menggunakan teknik seperti imputasi mean atau imputasi k-nearest neighbors. Penskalaan sangat penting untuk memastikan bahwa fitur dengan skala yang berbeda tidak mendominasi model.
- Perawatan Kesehatan: Dalam diagnosis medis, alur dapat digunakan untuk memproses data pasien, termasuk fitur numerik seperti usia, tekanan darah, dan kadar kolesterol, serta fitur kategorikal seperti jenis kelamin dan riwayat medis. Pengodean one-hot dapat digunakan untuk mengubah fitur kategorikal menjadi representasi numerik.
- E-commerce: Dalam sistem rekomendasi produk, alur dapat digunakan untuk memproses data pelanggan dan produk, termasuk fitur numerik seperti frekuensi pembelian dan peringkat produk, serta fitur kategorikal seperti kategori produk dan demografi pelanggan. Alur dapat mencakup langkah-langkah untuk praproses teks, seperti tokenisasi dan stemming, untuk mengekstrak fitur dari deskripsi produk dan ulasan pelanggan.
- Manufaktur: Dalam predictive maintenance, alur dapat digunakan untuk memproses data sensor dari mesin, termasuk fitur numerik seperti suhu, tekanan, dan getaran, serta fitur kategorikal seperti jenis mesin dan kondisi operasi. RobustScaler dapat sangat berguna di sini karena potensi pembacaan outlier.
Mengatasi Tantangan dalam Dataset Global
Saat bekerja dengan dataset global, Anda akan sering menemukan tantangan khusus yang memerlukan pertimbangan cermat selama praproses. Berikut adalah beberapa masalah umum dan strategi untuk mengatasinya:
- Format Data yang Bervariasi: Tanggal, angka, dan mata uang dapat memiliki format yang berbeda di berbagai wilayah. Pastikan penguraian dan pemformatan yang konsisten. Misalnya, tanggal mungkin dalam format HH/BB/TTTT atau BB/HH/TTTT. Gunakan pustaka yang sesuai untuk menangani konversi dan pemformatan tanggal.
- Perbedaan Bahasa: Data teks mungkin dalam bahasa yang berbeda, memerlukan terjemahan atau teknik praproses khusus bahasa. Pertimbangkan untuk menggunakan pustaka seperti Google Translate API (dengan pertimbangan penggunaan dan implikasi biaya yang sesuai) untuk terjemahan atau NLTK untuk pemrosesan teks khusus bahasa.
- Konversi Mata Uang: Data keuangan mungkin dalam mata uang yang berbeda. Konversikan semua nilai ke mata uang umum menggunakan nilai tukar terkini. Gunakan API yang andal untuk mendapatkan nilai tukar yang akurat dan real-time.
- Zona Waktu: Data deret waktu mungkin direkam dalam zona waktu yang berbeda. Konversikan semua stempel waktu ke zona waktu yang umum (misalnya, UTC) untuk memastikan konsistensi. Gunakan pustaka seperti pytz untuk menangani konversi zona waktu.
- Perbedaan Budaya: Nuansa budaya dapat memengaruhi interpretasi data. Misalnya, skor kepuasan pelanggan mungkin diinterpretasikan secara berbeda di berbagai budaya. Waspadai nuansa ini dan pertimbangkan saat merancang langkah-langkah praproses Anda.
- Masalah Kualitas Data: Kualitas data dapat bervariasi secara signifikan di berbagai sumber. Terapkan validasi data yang kuat dan prosedur pembersihan untuk mengidentifikasi dan memperbaiki kesalahan.
Kesimpulan
Praproses data adalah langkah penting dalam alur machine learning. Dengan menggunakan alur Scikit-learn, Anda dapat merampingkan alur kerja Anda, mencegah kebocoran data, dan meningkatkan performa model Anda. Menguasai teknik ini akan memberdayakan Anda untuk membangun solusi machine learning yang lebih kuat dan andal untuk berbagai aplikasi. Ingatlah untuk menyesuaikan langkah-langkah praproses dengan karakteristik spesifik data Anda dan persyaratan model machine learning Anda. Bereksperimen dengan teknik yang berbeda untuk menemukan kombinasi optimal untuk masalah khusus Anda. Dengan berinvestasi waktu dalam praproses data yang tepat, Anda dapat membuka potensi penuh dari algoritma machine learning Anda dan mencapai hasil yang superior.